#include "estadoimpresion.h"

EstadoImpresion::EstadoImpresion()
{
    this->painter = NULL;
    inicializar();
}

EstadoImpresion::EstadoImpresion(QPainter* painter, QRect rectanguloImpresion)
{
    this->painter = painter;
    this->rectanguloImpresion = rectanguloImpresion;
    inicializar();
}

EstadoImpresion::~EstadoImpresion()
{
}

void EstadoImpresion::inicializar()
{
    color = Qt::black;
    modo = MODO_PARRAFO;
    porcentajeInicioColumna = 0;
    porcentajeFinalColumna = 100;
    grosorTrazoMilimetros = .3;
    interlineado = 1;
    margenCeldas = 0;
    alineacionHorizontal = ALINEACION_IZQUIERDA;
    alineacionVertical = ALINEACION_LINEA_BASE;
    desplazamientoYPixeles = 0;
    numeroPagina = 1;

    nombreFuente = "Arial";
    tamanoFuente = 12;
    negrita = false;
    cursiva = false;
    subrayado = false;
}

void EstadoImpresion::setPainter(QPainter* painter)
{
    this->painter = painter; 
}

QPainter* EstadoImpresion::getPainter()
{
    actualizarFuente();
    actualizarLapiz();
    return painter;
}

void EstadoImpresion::recuadrar(QColor color)
{
    this->painter->setPen(color);
    this->painter->drawRect(rectanguloImpresion);    
}

void EstadoImpresion::setRectanguloImpresion(QRect rectanguloImpresion)
{
    this->rectanguloImpresion = rectanguloImpresion; 
}

void EstadoImpresion::setColor(QColor color) 
{ 
    this->color = color;
}

void EstadoImpresion::setGrosorTrazoMilimetros(double grosorTrazoMilimetros)
{
    this->grosorTrazoMilimetros = grosorTrazoMilimetros;
}

void EstadoImpresion::setNombreFuente(QString nombreFuente)
{
    this->nombreFuente = nombreFuente;
}

void EstadoImpresion::setTamanoFuente(double tamanoFuente) {
    this->tamanoFuente = tamanoFuente;
}

void EstadoImpresion::setNegrita(bool negrita) {
    this->negrita = negrita;
}

void EstadoImpresion::setCursiva(bool cursiva) {
    this->cursiva = cursiva;
}

void EstadoImpresion::setSubrayado(bool subrayado) {
    this->subrayado = subrayado;    
}

void EstadoImpresion::actualizarFuente()
{
    fuente.setFamily(nombreFuente);
    fuente.setPointSizeF(tamanoFuente);
    fuente.setWeight(negrita ? QFont::Bold : QFont::Normal);
    fuente.setItalic(cursiva);
    fuente.setUnderline(subrayado);

    if (painter != NULL) {        
        painter->setFont(fuente);
    }
}

int EstadoImpresion::getAltoPixelesFuente()
{
    actualizarFuente();
    QFontMetrics metrics(painter->fontMetrics());
    int alto = metrics.height();
    return alto;
}

void EstadoImpresion::actualizarLapiz()
{
    lapiz.setColor(color);    
    double grosorPixeles = grosorTrazoMilimetros * getPixelesPorMilimetro();
    lapiz.setWidthF(grosorPixeles);  
    lapiz.setJoinStyle(Qt::MiterJoin);
    lapiz.setCapStyle(Qt::FlatCap);
    
    if (painter != NULL) {        
        painter->setPen(lapiz);
    }
}

int EstadoImpresion::getAnchoColumna()
{
    if (porcentajeFinalColumna == 0) {
        return getAnchoPaginaPixeles();
    } else {
        return getXFinalColumna() - getXInicialColumna();
    }
}

void EstadoImpresion::setPorcentajeColumna(double porcentajeColumna)
{
    if (porcentajeColumna > 100 ) {
        porcentajeColumna = 100;
    }
    if (porcentajeColumna < porcentajeInicioColumna) {
        porcentajeColumna = porcentajeInicioColumna;
    }
    porcentajeInicioColumna = porcentajeFinalColumna;
    porcentajeFinalColumna = porcentajeColumna;
}

void EstadoImpresion::desactivarColumna()
{
    porcentajeInicioColumna = 0;
    porcentajeFinalColumna = 100;
}

int EstadoImpresion::calcularXInicial(int ancho, const QRect& rectangulo)
{
    switch (alineacionHorizontal)
    {
    default:
        return rectangulo.x();
    case ALINEACION_CENTRO:
        return rectangulo.x() + (rectangulo.width() - ancho) / 2;
    case ALINEACION_DERECHA:
        return rectangulo.x() + (rectangulo.width() - ancho);
    }
}

int EstadoImpresion::calcularYInicial(int alto, int descenso, const QRect& rectangulo, int descensoTotal)
{
    int yInicial;    

    int yLineaBase = rectangulo.bottom() - descensoTotal;

    switch (alineacionVertical)
    {
    default:
        yInicial = yLineaBase - (alto - descenso);
        break;
    case ALINEACION_ABAJO:
        yInicial = rectangulo.bottom() - alto;
        break;
    case ALINEACION_CENTRO:
        yInicial =  rectangulo.top() + (rectangulo.height() - alto) / 2;
        break;
    case ALINEACION_ARRIBA:
        yInicial = rectangulo.top();
        break;
    }

    if (yInicial < rectangulo.top()) {
        yInicial =  rectangulo.top();
    }
    return yInicial;
}

void EstadoImpresion::incrementarDesplazamientoYPixeles(int incrementoPixeles)
{
    desplazamientoYPixeles += incrementoPixeles;
}

